// 1、箭头函数
// 所有使用函数表达式的位置，均可以替换为箭头函数
/**
 * 箭头函数特点：
 * 1、不能使用new调用
 * 2、没有原型，既没有prototype属性
 * 3、没有arguments
 * 4、没有this指向,引用外面的this
 */
function sum1(a,b){ 
    return a+b
}
const sum2=(a,b)=>{
    return a+b;
}
console.log(sum2(1,2));
console.log(sum2.prototype);//undefined+

function method(){
    const m=()=>{
        console.log(arguments);
    }
    m(1,2,3)
}
method(1,2,3,1,2,3);
const user={
    name:'zhangsan',
    sayHellow(){
        setTimeout(() => {
            console.log(this.name);//zhangsan
        }, 100);
    }
}
user.sayHellow();


//2、剩余参数
function sum(a,b,...args){
    console.log(a,b,args);
}
sum(1,2,3,4,5,6)

//3、参数默认值
function method1(a,b=1){
    console.log(a,b);
}
method1(2);

// 4、class类语法
// 过去 函数有两种调用方式
function A(){}
A();//直接调用
new A();   //作为构造函数调用

//旧的写法
function User1(firstName,lastName){
    this.firstName=firstName;
    this.lastName=lastName;
    this.fullName=`${firstName}-${lastName}`;
}
// 静态方法
User1.isUser=function(u){
    return !!u&&!!u.fullName;
}
//调用方式
User1.isUser("zhangsan","adfa")

//实例方法
User1.prototype.sayHellow=function(){
    console.log(`hello,my name is ${this.fullName}`)
}
const u=new User1('zhang','san');
u.sayHellow.call(u,"zhang",'san')

//新的写法
class User2{
    constructor(firstName,lastName){
        this.firstName=firstName;
        this.lastName=lastName;
        this.fullName=`${firstName}-${lastName}`;
    }
    static isUser(u){
        return !!u&&!!u.fullName;
    }
    sayHellow(){
        console.log(`hello,my name is ${this.fullName}`)
    }
}
const user3=new User2('zhang','san');
user3.sayHellow(); 

// 函数api,apply(),bind(),call();